package editor
{
	import Classes.CLoader;
	import Classes.pi_events;
	
	import UIFree.ObjectEvent;
	import UIFree.controls.uif_gbutton;
	import UIFree.uif_Timer;
	import UIFree.uif_app;
	import UIFree.uif_ecomponent;
	
	import api_servers.pi_servers;
	
	import cardsbody.pi_pngcard;
	
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.system.ApplicationDomain;
	import flash.system.LoaderContext;
	
	public class pj_extendServices {
		private static var _extendLoaded : Object;
		
		public static function init(a_list: Object): void {
			pj_extendServices.list = a_list;
			if (!_extendLoaded) _extendLoaded = new Object();
		}
		
		public static function load(extend: Object, initFunc: Function = null): void {
			var _loadCount: int = 0;
			for (var i: String in extend) {
				if (loadService(i, function(e: Event): void {
						_loadCount--;
						if (_loadCount == 0) {
							if (initFunc != null) initFunc();
							app().dispatchEvent(new ObjectEvent(pi_events.PLUGINSCOMPLETE, loaded()));	
						} 
					})) _loadCount++;
			}
			if ((_loadCount == 0) && (initFunc != null)) initFunc(); 
		}
		
		public static function loadService(name: String, doComplete: Function=null): Boolean {
			var _app: photo_inject = app();
			if (!_extendLoaded[name] && list[name]) {
				new CLoader(_app, pi_servers.PLUGINS_URL + list[name].file + '?ver=' + app().externalserver.vars['ver'], function(e: Event): void {
					_extendLoaded[name] = e.target.loader.content;
					e.target.content.init(_app, _app.extendsLayer);
					var button: uif_gbutton = _app.extendsLayer.getExtButton(name); // Если уже есть кнопка плагина
					if (button) _extendLoaded[name].dispatchEvent(new ObjectEvent(pi_events.CREATEUSERINTERFACE, button)); // Тогда генерим событие создания интерфейса
					if (doComplete != null) doComplete(e);
				}, 0, 0, new LoaderContext(true, ApplicationDomain.currentDomain));
				return true;
			} else return false;
		}
		
//Создает кнопки плагинов		
		public static function createButtons(): void {
			var layer: uif_ecomponent = app().extendsLayer;
			var png_onlyButtons: Array = new Array();
			var _app: photo_inject = app();
			for (var i: String in list) { // Перебираем список плагинов
				if (list[i].caption) { // Если есть заголовок кнопки тогда создаем кнопку
//					trace(list[i].caption);
					var button: uif_gbutton = _app.extendsLayer.createExtButton(list[i].id, list[i].caption, doButtonRelease, list[i]);
					button._data = i;
					// Если плагин уже загружен тогда генерим событие создания интерфейса
					if (_extendLoaded[i]) _extendLoaded[i].dispatchEvent(new ObjectEvent(pi_events.CREATEUSERINTERFACE, button));
				}
				if (list[i].load) { // Если есть признак загрузки при старте тогда загружаем плагин
					if (list[i].load is Number)
						new uif_Timer(list[i].load * 1000, null, function(e: TimerEvent): void {
							loadService(e.target.params);
						}, 1, i);
					else loadService(i);
				}
				if (list[i].png_only) png_onlyButtons.push(button);
			}
			
			_app.addEventListener(pi_events.COMPLETELOADCARD, function(e: ObjectEvent): void {
				if ((_app.editor) && (e.object == _app.editor.cardBody)) {
					for (var b: int = 0; b<png_onlyButtons.length; b++)
						png_onlyButtons[b].disable = e.object.maskInfo.maskClass is pi_pngcard;
				}				
			});
		}

// Обработчик нажатия на кнопку плагина		
		protected static function doButtonRelease(e: MouseEvent): void {
			extendButtonClick(e.target._data, e.target as uif_gbutton);
		}
		
		public static function extendButtonClick(name: String, button: uif_gbutton=null): void {
			if (_extendLoaded[name]) // Если плагин загружен, тогда генерим собитие нажатия на кнопку 
				_extendLoaded[name].dispatchEvent(new ObjectEvent(pi_events.PLUGINBTRELEASE, name, true, true));
			else {
				var title: String;
				if (button) {
					title = button.text;
					button.text = 'Загружается';
					button.disable = true;
				}
				loadService(name, function(e2: Event): void {
					// Если плагин не загружен, тогда загружаем и после загрузки генерим событие нажития на кнопку
					if (button) {
						button.disable 	= false;
						button.text 	= title;
					}
					_extendLoaded[name].dispatchEvent(new ObjectEvent(pi_events.PLUGINBTRELEASE, name, true, true));
				});
			}			
		}
		
		private static function app(): photo_inject {
			return uif_app.instance() as photo_inject;
		}
		
		public static function loaded(): Object {
			return _extendLoaded;
		}
		
		public static var list: Object = {}
	}
}